% % 生成测试信号
% Fs = 48000*64;          % 采样率
% t = 0:1/Fs:1; % 时间向量
% f1 = 10000; f2 = 12040; % 信号频率
% data = sin(2*pi*f1*t) + 0.5*sin(2*pi*f2*t) + randn(size(t));
%
% % 调用函数
% plotPowerSpectrum1(data, 48000*64, Fs, '1kHz+12kHz Noise Signal');
function plotPowerSpectrum (data, pn,raw_fs,OSR,plot_title)
    % plotPowerSpectrum 计算并绘制功率谱
    % data        : 采样数据
    % N           : 采样点数
    % Fs          : 采样率 (Hz)
    % plot_title  : 绘图标题


    Custom_data = data(pn*OSR/4+1-OSR+1 : pn*OSR-OSR+1);
    N = length(data)*3/4;
    N=fix(N);
    Fs = raw_fs * OSR;


    % 检查数据长度是否足够
%     if length(Custom_data) < N
%         error('数据长度小于N，请检查输入参数');
%     end

    % 取前N个样本
    x = Custom_data(1:N);

    % FFT计算
    Y = fft(x);

    % 双边功率谱
    P2 = abs(Y / N).^2;

    % 单边功率谱 (保留一半 + 修正幅值)
    P1 = P2(1:floor(N/2)+1);
    P1(2:end-1) = 2 * P1(2:end-1);

    % 频率轴
    f = Fs * (0:floor(N/2)) / N;

    % % 绘图
    % figure;
    % plot(f, 10*log10(P1), 'LineWidth', 1.5);
    % grid on;
    % xlabel('Frequency (Hz)');
    % ylabel('Power (dB)');
    % title(plot_title);
    P1 = 10*log10(P1);

    % ==== 绘图 ====
    figure;
    hold on;

    % ==== 主瓣和噪声划分 ====
    mainlobe_mask = f <= 20000;  % 主瓣定义为 0~20kHz
    noise_mask    = ~mainlobe_mask;

    % 主瓣用红色线绘制
    plot(f(mainlobe_mask), P1(mainlobe_mask), 'r', 'LineWidth', 1.5);
    % 噪声用蓝色线绘制
    plot(f(noise_mask), P1(noise_mask), 'b--', 'LineWidth', 1);
    % 画辅助线标注主瓣界限
    ylimits = ylim;
    line([22000 22000], ylimits, 'Color', [0.5 0.5 0.5], 'LineStyle', ':');

    % 图形设置
    xlabel('频率 (Hz)');
    ylabel('功率 (dB)');
    title(sprintf('%s\n主瓣 vs 噪声对比(主瓣 ≤ 20KHz)', plot_title));
    legend('主瓣频段 (≤20KHz)', '噪声频段 (>20KHz)', 'Location', 'best');
    xlim([0, min(Fs/2, 100e3)]);
    grid on;
end
